#!usr/bin/python
# -*- coding:utf-8 -*-

"""
首次在数据库中添加数据
1. 读取 226 数据库， status_water_xxx 中，对每个 id 计数，对应的即为对应 id 的机组运行条数，也就是数据条数；
2. 创建新表，用于记录各 id 对应的数据条数，此时该表中有重复数据（即相同 id 和 log_time 具有多条数据）
3. 创建新表，用于将重复数据累加，将新表写入 229 中。

该 py 文件用于首次对所有 status_water_xxx  （不包含当天数据）数据进行操作。
这是因为 status_water_xxx 收集的为前一天 4 时至第二天 4 时的数据。

status_water_xxx 数据每日均会添加，因此在此基础上，新建立 TimeMultiTableOperator.py 文件用于每天定时操作。
"""
import pymysql

# 查询数据库
conn = pymysql.connect(host='xx.x.xx.226', port=3306, user='root', passwd='xxx', db='wolf', charset='utf8')
cursor = conn.cursor()

# 获取数据库中所有表名称
get_table_name = "select table_name from information_schema.tables where table_schema='wolf' and table_name like 'status_water%';"
# 执行
cursor.execute(get_table_name)
# 获取所有的表名称
key_days = cursor.fetchall()

# 插入数据库
input_conn = pymysql.connect(host='xx.x.xx.229', port=3306, user='root', passwd='xxx', db='gprs', charset='utf8')
input_cursor = input_conn.cursor()
drop_table = '''DROP TABLE IF EXISTS day_value'''
input_cursor.execute(drop_table)

# zid = 1        # 自增 id，创建表时已经设置为自增
create_table = '''
        create table day_value(
        zid INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
        unitId INT NOT NULL,
        imei VARCHAR(64) NOT NULL,
        linkerId INT NOT NULL,
        log_time date NOT NULL,
        status_value INT NOT NULL)ENGINE=innodb DEFAULT CHARSET=utf8;
'''
input_cursor.execute(create_table)
sql = "INSERT INTO day_value(unitId, imei, linkerId, log_time, status_value) VALUES (%s,%s,%s,%s,%s)"

# 这里，首先运行到前2天的数据，第二天的用于定时操作验证
for key_day in key_days[:-2]:
    select_sql2 = "select sw.id as unitId, substring_index(linker.iuid,'-',-1) as imei, linker.id as linkerId, \
                    substring_index(sw.transfer_time, ' ', 1) as log_time,count(sw.id) as status_value \
                        from {key} sw, \
                        iot_unit unit, \
                        iot_linker linker \
                        where \
                        sw.id=unit.id and unit.linker_id=linker.id group by substring_index(linker.iuid,'-',-1), substring_index(sw.transfer_time,' ',1);".format(
                        key=key_day[0])
    cursor.execute(select_sql2)
    result = cursor.fetchall()

    # 批量插入
    try:
        input_cursor.executemany(sql, result)
        input_conn.commit()
    except Exception as e:
        # 有异常，回滚事务
        input_conn.rollback()

# 对 imei 进行处理，实现更新操作
imei_correct = "update day_value set imei = replace(imei, imei, substring(imei, -16, 15)) where length(imei) > 15;"
input_cursor.execute(imei_correct)
input_conn.commit()

# 将累加统计结果写入新表中
new_table = "create table day_value_update (zid int primary key auto_increment) as select unitId, imei, linkerId, sum(status_value) status_value, log_time  \
            from day_value group by unitId, imei, linkerId, log_time;"
input_cursor.execute(new_table)

input_cursor.close()
input_conn.close()
cursor.close()
conn.close()

